作者 | Benedek Rozemberczki
译者 | 天道酬勤 责编 | Carol
出品 | AI科技大本营(ID:rgznai100)
空手道俱乐部(Karate Club)是NetworkX Python软件包的无监督机器学习扩展库。详细可以参阅此处的文档:https://github.com/benedekrozemberczki/karateclub。空手道俱乐部采用先进的方法对图结构化数据进行无监督学习。简而言之,它是用于小型图形挖掘研究的瑞士军刀。首先,它在节点级和图级提供了网络嵌入技术。其次,它包括各种重叠和不重叠的社区检测方法。实现的方法涵盖广泛的网络科学(NetSci,Complenet)、数据挖掘(ICDM,CIKM,KDD)、人工智能(AAAI,IJCAI)和机器学习(NeurIPS,ICML,ICLR)会议、研讨会和著名期刊。
一个简单示例
空手道俱乐部使现代社区检测技术的使用变得非常容易(可参阅此处的随附教程:https://karateclub.readthedocs.io/en/latest/notes/introduction.html)。下面的代码段在合成图上使用了重叠的社区检测算法。
当创建空手道俱乐部时,我们使用了面向API的机器学习系统设计观点——为了成为最终用户友好的机器学习工具。这种面向API的设计原则包含一些简单的思想。在本节中,我们将通过适当的说明性示例详细讨论这些思想及其明显的优势。通过使用适当的Python对象的构造函数来创建无人监督的空手道俱乐部模型实例。该构造函数具有一个默认的超参数设置,该设置允许合理地使用现成的模型。简单地说,这意味着最终用户不需要非常详细地理解内部模型机制,就可以使用在我们的框架中实现的方法。我们设置这些默认超参数来提供合理的学习和运行时性能。如果需要,可以在模型创建时使用构造函数的适当参数化来修改这些模型超参数。超参数存储为公共属性,以便允许检查模型设置。我们通过上面的代码片段演示了超参数的封装。首先,我们要为使用标准超参数设置的NetworkX生成的Erdos-Renyi图创建一个嵌入。当构建模型时,我们不会更改这些默认超参数,而可以打印尺寸超参数的标准设置。其次,我们可以设置不同数量的维度,因此我们创建了一个新模型,并且仍然可以公开访问维度超参数。空手道俱乐部中的每个无监督机器学习模型都实现为一个单独的类,该类继承自Estimator类。因为我们假设最终用户对与特定技术有关的算法细节不是特别感兴趣,所以在我们的框架中实现的算法只有少数几种公共方法。
所有模型都通过使用fit()方法进行拟合,该方法接受输入(图形、节点特征)并调用适当的私有方法来学习嵌入或集群。节点和图的嵌入由get_embedding()公共方法返回,而集群成员关系则通过调用get_memberships()来检索。
在上面的代码段中,我们创建了一个随机图,并使用具有默认超参数的DeepWalk模型,使用public fit()方法对该模型进行拟合,并通过调用public get_embedding()方法返回嵌入。我们可以对这个示例进行修改,通过更改模型导入和构造函数以最小的工作量创建嵌入的walklet,这些修改将产生下面的代码片段。
综观以上两个代码片段,API驱动设计的优势显而易见,因为我们只需要进行一些修改即可。首先,必须更改嵌入模型的导入。其次,我们需要更改模型构造,并且已经设置了默认的超参数。第三,DeepWalk和Walklets类提供的公共方法的行为相同。嵌入是通过fit()学习的,并由get_embedding()返回。当用于特征提取的上游非监督模型性能较差时,这可以快速、最少地更改代码。
我们设计了空手道俱乐部,以便在拟合模型时使用标准化的数据集提取。实际上,这意味着目的相同的算法使用相同的数据类型进行模型训练。详细如下:
- 基于邻域和结构节点的嵌入技术使用单个NetworkX图作为拟合方法的输入。
- 属性节点嵌入过程将NetworkX图作为输入,并将要素表示为NumPy数组或SciPy稀疏矩阵。在这些矩阵中,行对应于节点,列对应于特征。
- 图级嵌入方法和统计图指纹将NetworkX图的列表作为输入。
图挖掘算法的底层机制是使用广泛使用的Python库实现的,这些库不依赖于操作系统,并且不需要其他外部库(如TensorFlow或者PyTorch)的存在。空手道俱乐部中的内部图形表示使用NetworkX。密集的线性代数运算是使用NumPy完成的,而稀疏的对等运算则使用SciPy。隐式矩阵分解技术利用GenSim软件包,而依赖图形数据处理的方法则使用PyGSP。空手道俱乐部的标准化输出生成可确保用于相同目的的无监督学习算法始终以一致的数据点顺序返回相同类型的输出。这种设计原则具有非常重要的意义。当将某种类型的算法替换为相同类型的算法时,不必更改使用上游无监督模型输出的下游代码。具体而言,通过我们的框架生成的输出使用以下数据结构:调用get_embedding()方法时,节点嵌入算法(保留领域、属性和结构)始终返回NumPy浮点数组。数组中的行数是顶点数,并且行索引始终对应于顶点索引。此外,列数是嵌入维数。
当调用get_embedding()方法时,整个图形嵌入方法(光谱指纹、隐式矩阵分解技术)将返回Numpy浮点数组。行索引对应于单个图在输入图列表中的位置。同样,列代表嵌入维数。
调用get_memberships()方法时,社区检测过程将返回一个字典。节点索引是键,与键对应的值是顶点的社区成员。某些图集群技术会创建节点嵌入,来查找顶点集群。调用get_embedding()方法时,它们将返回NumPy浮点数组。该数组的结构类似于节点嵌入算法返回的数组。
我们将通过下面的代码片段演示标准化的输出生成和接口。我们创建随机图的集群,并返回包含集群成员资格的字典。使用外部社区库,我们可以计算这些集群的模块化。这表明标准化的输出生成将与外部图挖掘和机器学习库的接口变得更容易了。 6) 局限性
目前,空手道俱乐部的设计存在一定的局限性,我们对输入进行了假设。我们假定NetworkX图是无向的,并且由单个强连接的组件组成。所有算法都假定节点的索引是连续的,并且起始节点索引为0。此外,我们假设图不是多部分的,节点是均匀的,并且边是未加权的(每个边都有单位权重)。
对于整个图形嵌入算法,图集中的所有图形都必须修改先前列出的关于输入的要求。基于Weisfeiler-Lehman特性的嵌入技术允许节点具有单个字符串功能,可以使用功能键进行访问。在没有此键的情况下,这些算法默认将中心度用作节点特征。
如果有不清楚的地方或其他意见,欢迎评论告诉我们。
https://hackernoon.com/karate-club-a-python-library-for-graph-representation-learning-05383yh9《原力计划【第二季】- 学习力挑战》正式开始!即日起至 3月21日,千万流量支持原创作者!更有专属【勋章】等你来挑战